package com.yuncheng.mcp.tool;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.ai.chat.model.ToolContext;

import java.util.HashMap;
import java.util.Map;

/**
 * 动态工具接口
 */
/**
 * 动态工具接口
 */
public interface DynamicTool {
    // ObjectMapper用于JSON处理
    ObjectMapper OBJECT_MAPPER = new ObjectMapper();

    /**
     * 获取工具名称
     */
    String getName();

    /**
     * 获取工具描述
     */
    String getDescription();

    /**
     * 执行工具
     * @param arguments 参数映射
     * @return 执行结果
     */
    Object execute(Map<String, Object> arguments);

    /**
     * 使用上下文执行工具
     * @param arguments 参数映射
     * @param context 工具上下文
     * @return 执行结果
     */
    default Object executeWithContext(Map<String, Object> arguments, ToolContext context) {
        // 默认实现忽略上下文
        return execute(arguments);
    }

    /**
     * 获取参数类型映射
     */
    Map<String, Class<?>> getParameterTypes();

    /**
     * 生成输入类型的JSON Schema
     */
    default String generateInputSchema() {
        try {
            Map<String, Object> schema = new HashMap<>();
            schema.put("type", "object");

            Map<String, Object> properties = new HashMap<>();
            Map<String, Object> required = new HashMap<>();

            getParameterTypes().forEach((name, type) -> {
                Map<String, Object> property = new HashMap<>();
                property.put("type", mapJavaTypeToJsonType(type));
                properties.put(name, property);
                required.put(name, true);
            });

            schema.put("properties", properties);
            schema.put("required", required.keySet().toArray());

            return OBJECT_MAPPER.writeValueAsString(schema);
        } catch (Exception e) {
            return "{}";
        }
    }

    /**
     * 解析输入JSON为参数Map
     */
    default Map<String, Object> parseInput(String input) {
        try {
            return OBJECT_MAPPER.readValue(input, Map.class);
        } catch (Exception e) {
            throw new RuntimeException("Failed to parse input: " + e.getMessage(), e);
        }
    }

    /**
     * 格式化输出结果为JSON
     */
    default String formatOutput(Object result) {
        try {
            return OBJECT_MAPPER.writeValueAsString(result);
        } catch (Exception e) {
            return "{\"result\": \"" + result.toString() + "\"}";
        }
    }

    /**
     * 将Java类型映射为JSON类型
     */
    default String mapJavaTypeToJsonType(Class<?> type) {
        if (Number.class.isAssignableFrom(type) || type.isPrimitive() && !boolean.class.equals(type)) {
            return "number";
        } else if (Boolean.class.equals(type) || boolean.class.equals(type)) {
            return "boolean";
        } else {
            return "string";
        }
    }
}
